package com.hjr.leetcode.question100;

/**
 * 8. 字符串转换整数 (atoi)
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 *
 * 函数 myAtoi(string s) 的算法如下：
 *
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 * 返回整数作为最终结果。
 */
public class q8 {

    public static void main(String[] args) {
        System.out.println(myAtoi(" -1010023630o4"));
    }

    //第一种，直接循环遍历 1ms 41mb
    public static int myAtoi(String s) {
        if (s.isBlank()){
            return 0;
        }
        int total = 0;
        int index = 0;
        while (s.charAt(index) == ' '){
            index++;
        }

        boolean flag = true;
        for (int i = index; i < s.length(); i++) {
            if (i == index){
                if (s.charAt(i) == '-'){
                    flag = false;
                    continue;
                }else if (s.charAt(i) == '+'){
                    continue;
                }
            }
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                total = total * 10 + (s.charAt(i) - '0');
                if (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9'){
                    if (total > Integer.MAX_VALUE / 10){
                        return flag ? Integer.MAX_VALUE : Integer.MIN_VALUE;
                    }else if (total == Integer.MAX_VALUE / 10){
                        if (s.charAt(i + 1) > '7'){
                            return flag ? Integer.MAX_VALUE : Integer.MIN_VALUE;
                        }
                    }
                }
            }else {
                break;
            }
        }
        return flag ? total : -total;
    }
}
